Android开发高手课 第一节 课后作业解析 —— 分析 Native crash dump
问题一:使用demo中的minidump_stackwalk编译Native Crash 的dmp文件的时候,提示缺少so库链接:
minidump_stackwalk
是breakpad官方的一个解析Native Crash的工具,clone 官方breakpad项目,按照官方文档中的步骤,在breakpad下使用 ./configure && make
编译整个项目,会生成不同环境下的minicamp_stackwalk
工具,使用这个工具,运行命令 minicamp_stackwalk crashDump/xxxx.dmp >crashLog.txt
。会生成一个Native Crash的Log文件,名称为crashLog。文件内容部分如下:
1 | Operating system: Android |
可以看到堆栈信息全部打印出来了,下一步使用ndk提供的addr工具进行符号解析。
问题二:使用ndk工具对crash 日志进行符号解析
在ndk/toolchains/
路径下有对应的不一样arm结构的解析工具,其中arm-xxxx
对应的是arm架构,而 aarch64-xxxx
对应的是arm64架构,我们这里上面有CPU输出,是arm64架构,所以这里应该使用aarch64-xxx
,使用命令 aarch64-linux-android-addr2line -f -C -e sample/build/intermediates/transforms/mergeJniLibs/debug/0/lib/arm64-v8a/libcrash-lib.so 0x5a0
就会得到如下输出:
1 | Crash() |
提示crash.cpp的第10行发生了错误。
命令的最后的 0x5a0 实际上是偏移量,通过ndk的工具解析后就可以得到发生错误的位置。
遇到的问题:
aarch64-linux-android-addr2line
命令提示:commond not found。- 配置环境变量,Mac在.bash_profile下,配置:
1
export PATH=${PATH}:/Users/fengbo/myFiles/android-ndk-r13b/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin
其中
aarch64-xxx
根据需要配置运行命令发现提示
file format not recognized addr2line
:- 没有运行对应的架构下的工具,例如在arm64架构下运行了
arm-xxxx
, 更换工具就可以解决。
- 没有运行对应的架构下的工具,例如在arm64架构下运行了